﻿#define _CRT_SECURE_NO_WARNINGS 1
//static关键字的使用

//static修饰局部变量
//#include<stdio.h>
//
//void test1()
//{
//	int n1 = 1;
//	n1++;
//	printf("%d ", n1);
//}
//
//void test2()
//{
//	static int n2 = 1;
//	n2++;
//	printf("%d ", n2);
//}
//
//int main()
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		test1();//局部变量没有用static修饰的结果：2 2 2 2 2
//	}
//
//	printf("\n");
//
//	for (i = 0; i < 5; i++)
//	{
//		test2();//static修饰局部变量后的结果是：2 3 4 5 6，这就说明static修饰局部变量后会将局部变量的生命周期改成整个工程的生命周期
//	}
//
//	//n2++;//err，当然static修饰局部变量生命周期变了但作用域依然不变
//
//
//	return 0;
//}


//extern的使用
//extern是一个声明外部符号的关键字
//#include<stdio.h>
//
//extern int n;//在add.c文件中定义了n变量，
// 在test.c文件中用extern 声明这个变量的类型和变量名即可使用这个变量
//
//int main()
//{
//	printf("%d\n", n);
//
//	return 0;
//}

//static修饰全局变量
//#include<stdio.h>
//
//extern int n;
//
//int main()
//{
//	printf("%d\n", n);//err, 被static修饰的全局变量，只能在定义的文件里使用，外部文件是无法使用到的。
//	//也就是static修饰的全局变量把全局变量的外部链接属性改为了内部链接属性
//
//	return 0;
//}

//static修饰函数
#include<stdio.h>

extern int Add(int x, int y);
extern int Sub(int x, int y);//即使声明了也无法使用被static修饰的函数

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);

	//Add是没有被static修饰过的函数
	//Sub是被static修饰过的函数

	int ret1 = Add(a, b);
	printf("%d\n", ret1);//可以正常运行

	int ret2 = Sub(a, b);
	printf("%d\n", ret2);//err, 可以说明被static修饰的函数，只能在定义的文件里使用，外部文件是无法使用到的
	//和全局变量被修饰一样，将函数的外部链接属性改为了内部链接属性

	return 0;
}